﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Decoretor
{
    /*
     * 装饰者模式是个很有用也很厉害的模式
     * 故名思意  装饰者，作用不是new 一个新的功能，也不是
     * 处理类类之间关系的，他是一个装饰着，也就是让原来的房子更漂亮更实用
     *
     *  OK    也就是让稳定的更稳定，变化的给分出来
     *
     *  前段时间有个同事，通过SDK控制机器人巴拉巴拉的一通动作。
     *  突然，产品经理提出一个问题，要机器人每动作一步，要记录动作开始的时间和结束时间显示出来
     *  同事老刘看着几千行的MoveJ A To B   心里有句MMP不知当不当讲
     *
     * 又过了几天，产品经理又提出，移动之前要提醒操作员工   发出比波比波比的声音。。。
     *    移动之后也提示比波比波比   是不是很MMP   但是也算合理
     * 好伐
     *
     *  话不多说开撸代码；
     *  方案1： 每个移动的方法前面加Log，执行完加Log； 很多行  可行吗？？？改完了  又来了比波比。。再改一次？
     *
     *  方案2：重新做一个类，给机器人的SDK包一层。。。这个方法貌似不错啊。。。那就开干呗。。。
     * 
     * 老刘改啊改，美好的周末在加班中度过了
     *
     *
     * 我感觉这个装饰者是很厉害很好用，单纯采用继承方案会导致子类急剧增加，采用装饰者这种组合和继承的模式
     * 有效的防止子类急剧增加   对于后期增加功能，或者需要对现有功能进行不同的组合，非常的高效
     *
     *
     * 官方定义:在某个类的基础上拓展某个类的基础操作，继承为类型引入了静态特质，组合引用动态特质=》组合优于
     * 继承
     */
    class DecoretorRobotAlarm :IMoveable
    {
        public DecoretorRobotAlarm( IMoveable robot)
        {
            Robot = robot;
        }

        private IMoveable Robot { get; set; }

        public void MoveJ(string pointstart, string pointend)
        {
            Console.WriteLine("移动之前先报警*****比波比波比");
            Robot.MoveJ(pointstart, pointend);
            Console.WriteLine("移动之后报完成*****比波比波比");
        }
    }
}
